package com.atguigu.rabbitmq.eight;

import com.atguigu.rabbitmq.utils.RabbitMqutils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.util.HashMap;
import java.util.Map;

/**
 * 死信队列
 * 消费者 1
 * 大小写切换 ctrl+shirft+u
 */
public class Consumer01 {
    //普通交换机的名称
    public static final String NORMAL_EXCHANGE = "normal_exchange";
    //死信交换机的名称
    public static final String DEAD_EXCHANGE = "dead_exchange";
    //普通队列的名称
    public static final String NORMAL_QUEUE = "normal_queue";
    //死信队列的名称
    public static final String DEAD_QUEUE = "dead_queue";


    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqutils.getChannel();
        //声明死信交换机 类型为direct  1.交换机的名字  2.交换机的类型
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);
        //声明普通交换机 类型为direct
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        /**
         *          * 生成一个队列
         *          * 1.队列名称
         *          * 2.队列中的消息是否持久化  默认消息存储在内存中 否不持久化 （持久化放在磁盘中）
         *          *3.该队列是否只供一个消费者进行消费 是否共享  true 可以多个消费者消费  默认false,只能一个消费者消费
         *          4.是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true自动删除 false不删除
         *          5.其他参数
         *
         */


        //声明普通队列
        Map<String, Object> arguments = new HashMap<>();
        //过期时间   10s=100000ms
       //  arguments.put("x-message-ttl",100000);
        //正常队列设置死信交换机        1.值  2.死信交换 机名字
        arguments.put("x-dead-letter-exchange", DEAD_EXCHANGE);
        //设置死信RoutingKey
        arguments.put("x-dead-letter-routing-key", "lisi");
        //设置正常队列长度的限制
        //arguments.put("x-max-length",6);

        //声明普通队列
        channel.queueDeclare(NORMAL_QUEUE, false, false, false,arguments);

        //声明死信队列
        channel.queueDeclare(DEAD_QUEUE, false, false, false, null);

        //绑定普通的交换机与偶有普通的队列
        channel.queueBind(NORMAL_QUEUE,NORMAL_EXCHANGE,"zhangsan");
        //绑定死信的交换机与偶有死信的队列
        channel.queueBind(DEAD_QUEUE,DEAD_EXCHANGE,"lisi");
        System.out.println("等待接收消息.......");

        DeliverCallback deliverCallback = (var1, var2) -> {
           String msg= new String(var2.getBody(), "utf-8");
           if (msg.equals("info5")){
               System.out.println("Consumer01接受的消息是"+msg+"消息是被拒绝的");
               // 1.获取到值 2.不放回普通队列
               channel.basicReject(var2.getEnvelope().getDeliveryTag(),false );
           }else {
               System.out.println("Consumer01接受的消息是" +msg);
               channel.basicReject(var2.getEnvelope().getDeliveryTag(),false );
           }


        };
     //   channel.basicConsume(NORMAL_QUEUE, true, deliverCallback, var1 -> {});
        channel.basicConsume(NORMAL_QUEUE, false, deliverCallback, var1 -> {});
    }


}
